package preguntas;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Properties;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;

import utilidades.FileUtilities;
import utilidades.PropertiesFile;




public class PreguntaArbolBinarioBusqueda {
	/**
	 * @param args
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	public static void main(String[] args) throws FileNotFoundException, IOException {			
		Random rnd = new Random();
		
		Properties properties = new PropertiesFile().getProperties();		
		int seed;
		int seedProperty;
		int treeSize;
		int extractionsNumberBST;
		String property;
		extractionsNumberBST=0;
		int numberOfResult=0;
		ArrayList<Integer> anchura=new ArrayList<Integer>();
		ArrayList<Integer> anchuraRes=new ArrayList<Integer>();
		
		String feedBack="";
		String xmlFormat="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n ";
		String giftFormat="";
		String question="";
		
		String filenameXml="Preguntas/Arboles/PreguntaArbolesBusquedaXml.xml";
		String filenameGift="Preguntas/Arboles/PreguntaArbolesBusquedaGift.txt";
		
		
		File fileXml=FileUtilities.createFile(filenameXml);
		File fileGift=FileUtilities.createFile(filenameGift);
		
		xmlFormat=xmlFormat+"<quiz>\r\n\t <question type=\"category\">\r\n\t <category>\r\n\t <text>Estructura de datos</text>\r\n </category>\r\n </question>";
		
		
		property=properties.getProperty("treeSize");	
		treeSize=Integer.parseInt(property);			
		
		property=properties.getProperty("extractionsNumberBST");
		extractionsNumberBST=Integer.parseInt(property);	
		
		property=properties.getProperty("seedBST");			
		seedProperty=Integer.parseInt(property);
		
		if(seedProperty==-1)
			seed= (int) java.lang.Math.round(Math.random()*999999999+0);
		else
			seed=seedProperty;
		rnd.setSeed(seed);
		 
		xmlFormat=xmlFormat+" <question type=\"cloze\"> \r\n\t <name> \r\n\t <text>pregunta de Arboles Binarios de Busqueda  con seed="+seed +"</text>\r\n</name> \r\n<questiontext format=\"html\">\r\n\t <text>\r\n\t ";
		giftFormat=giftFormat+"::Pregunta Arboles Binarios de Busqueda seed="+seed +"::\r\n"; 
		
		
		
		
		 ArrayList<Integer>aux= new ArrayList<Integer>();
		 for(int i=0;i<99;i++)
			 aux.add(i);		 	
		 Collections.shuffle(aux, rnd);					
		 
		 
		 

		 ArrayList<Integer>tree= new ArrayList<Integer>();
		 for(int i=0;i<treeSize;i++)
			 tree.add(i, aux.get(i));			
		
		 

		 ArbolBB arbol = new ArbolBB();				
		 for(int i=0; i<treeSize; i++)
			 arbol.insertar(tree.get(i));			
		
		// System.out.println("Recorrido en anchura:");
	    anchura= arbol.recorridoEnAnchura(); 
	   
	    
	    xmlFormat=xmlFormat+" <![CDATA[<p> Dado un  árbol binario de búsqueda cuyo recorrido en anchura es ";
	    giftFormat=giftFormat+"Dado un  árbol binario de búsqueda cuyo recorrido en anchura es ";
		question=question+"Dado un  árbol binario de búsqueda cuyo recorrido en anchura es ";
	    
		 for(int i=0; i<anchura.size();i++)
		{
			xmlFormat=xmlFormat+anchura.get(i)+" ";
			giftFormat=giftFormat+anchura.get(i)+" ";
			question=question+anchura.get(i)+" ";
		}
	     
	    xmlFormat=xmlFormat+"</p>\r\n <p>Indicar el recorrido en anchura resultante tras borrar las claves ";
	    giftFormat=giftFormat+ "\r\n Indicar el recorrido en anchura resultante tras borrar las claves ";
	    question=question+"\nIndicar el recorrido en anchura resultante tras borrar las claves "; 


	     Collections.shuffle(tree, rnd);	
	    
	     ArrayList<Integer>nodoAeliminar= new ArrayList<Integer>();
	     for(int i=0; i<extractionsNumberBST; i++)
	    	 nodoAeliminar.add(i, tree.get(i));	    	 
	     
	     
	     for(int i=0;i<extractionsNumberBST; i++)
	     {
	    	 xmlFormat=xmlFormat+nodoAeliminar.get(i)+"";
	    	 giftFormat=giftFormat+nodoAeliminar.get(i)	+" ";	 
	    	 question=question+nodoAeliminar.get(i)	+" ";	
	     }
	     
	     giftFormat=giftFormat+"{\r\n ";
		 xmlFormat=xmlFormat+" </p> ";
	     
	     
	     for(int i=0; i<extractionsNumberBST; i++)
	 	     arbol.eliminar(nodoAeliminar.get(i)); 
	     
	     
	     
	    question=question+"\nArbol resultante: ";
	   anchuraRes= arbol.recorridoEnAnchura();    
	   
		 xmlFormat=xmlFormat+"<p> ";
		 giftFormat=giftFormat+"=%100%";
		 
		 numberOfResult=treeSize-extractionsNumberBST;
		 for (int i=0;i<numberOfResult;i++)
		 {
			 xmlFormat=xmlFormat+"{1:MULTICHOICE:";
			 giftFormat=giftFormat+anchuraRes.get(i)+" ";
			 feedBack="El resultado correcto es la letra "+anchuraRes.get(i);
			 question=question+anchuraRes.get(i)+" ";
			 for(int j=0;j<tree.size();j++)
			 {
				 if(j==0)
				 {
					 if(anchura.get(j)!=anchuraRes.get(i))
						 xmlFormat=xmlFormat+"~";
					 else
						 xmlFormat=xmlFormat+"=";
				 }
				 else
				 {
					 xmlFormat=xmlFormat+"~";
					 if(anchura.get(j)==anchuraRes.get(i))
						 xmlFormat=xmlFormat+"=";
				 }
				
				 xmlFormat=xmlFormat+anchura.get(j)+"#"+feedBack;
				 
			 }
			 xmlFormat=xmlFormat+"} ";
		
		 }
	   
	   
	   
	   xmlFormat=xmlFormat+" </p> </p>]]>\r\n</text> \r\n </questiontext>\r\n <generalfeedback format=\"html\"> \r\n\t <text/> \r\n</generalfeedback>\r\n </question>\r\n	</quiz>\r\n";
		 giftFormat=giftFormat+"\r\n}";
		 FileUtilities.writeFile(fileXml, xmlFormat); 
		FileUtilities.writeFile(fileGift, giftFormat);  
		Logger.getLogger("logger").log(Level.INFO,question+"\n");
	     
	}
}
	